<?

/**
 * Usuario class
 *
 * Esta clase gestiona las acciones de un usuario (login, logout, etc)
 * @author Alejandro Garcia del Rio <alejandro.garciadelrio@elserver.com>
 * @version 1.0
 * @package Usuario
*/
class User extends Core {

	static protected $instancia;
	static protected $opciones = array();
	static private $expires = 5400; // Tiempo en el que expira la sesion del usuario sso en segundos (default 1.30hs)
	static private $token = null;

	function __construct ($opciones=null) {
		// Llamo al constructor del parent tambien
		parent::__construct();
		// Seteo las opciones
		if ($opciones)
			$this->opciones($opciones);
	}

	/**
	 * Devuelve una unica instancia de esta clase
	 * 
	 * @return object Instancia de esta clase
	 */
	public static function getInstance() {
		if (!self::$instancia instanceof self)
			self::$instancia = new self;
		return self::$instancia;
	}

	/**
	 * Setea las opciones 
	 * 
	 * @param array $opciones (opcional) Opciones validas para esta clase. Si esta vacio, funciona como un getter.
	 * @return array $opciones Listado de opciones
	 */
	public function opciones ($opciones=null) {
		return self::$opciones = parent::opciones(self::$opciones, $opciones);
	}

	/**
	 * Loguea un usuario
	 * 
	 * @param string $user Usuario
	 * @param string $pass Password del usuario
	 * @return boolean
	 */
	public function login ($user, $pass) {

		// Saneamiento de variables
		$user = mysql_real_escape_string($user);
		$pass = mysql_real_escape_string($pass);
		
		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();
		
		// Encrypt the pass
		$pass = call_user_func(CONFIG_LOGIN_ENCRYPT_METHOD, $pass);

		// Busco el user/pass en la base de datos
		if (!($data = $db->get_row("SELECT " . CONFIG_LOGIN_DATA . " FROM " . CONFIG_LOGIN_TABLE . " WHERE " . CONFIG_LOGIN_USER_COLUMN . " = '$user' AND " . CONFIG_LOGIN_PASS_COLUMN . " = '$pass'")))
			return ($this)? $this->fail('Wrong username or password') : false;

		// Obtengo un objeto de sesion
		$session = ($this)? $this->session : Session::getInstance();

		// Guardo los datos en la sesion
		$session->set('info', $data);
		$session->set('route', CONFIG_SYSTEM_URL . 'admin'); // Todo: change for right ACL level

		return $data;
	}

	/**
	 * Devuelve si un usuario esta logueado o no
	 * 
	 * @return boolean
	 */
	public function logged () {

		// Obtengo un objeto de sesion
		$session = ($this)? $this->session : Session::getInstance();

		// Tiene que tener seteado el usuario.id
		if (!$session->get('info')) {
			return ($this)? $this->fail('No estas logueado') : false;
		}

		return true;
	}

	/**
	 * Desloguea a un usuario
	 * 
	 * @return boolean
	 */
	public function logout () {
		
		// Obtengo un objeto de sesion
		$session = ($this)? $this->session : Session::getInstance();

		// Borro la informacion del usuario de la sesion
		$session->del('info');
		
		return true;

	}

}
 
?>
